package com.lims.dao.base;

import java.lang.reflect.ParameterizedType;
import java.sql.SQLException;
import java.util.List;
import java.util.Map;
import java.util.Iterator;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.hibernate.Criteria;
import org.hibernate.HibernateException;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.criterion.DetachedCriteria;
import org.hibernate.criterion.MatchMode;
import org.hibernate.criterion.Order;
import org.hibernate.criterion.Projections;
import org.hibernate.criterion.Restrictions;
import org.springframework.orm.hibernate3.HibernateCallback;
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;



public class BaseDAOImpl<E> extends HibernateDaoSupport  {
	
	private static final Log log = LogFactory.getLog(BaseDAOImpl.class); 
	
	protected Class<E> presistClass;
	
	
    ///////////////////////////////////////////////////////////////////////////////////////////////////////////
	/**
     *  描    述： 构造函数：获取类名
     *  输入参数： 
     *  返 回 值： 无
     *  作    者： 冯晶晶
     *  开发日期： 2009-08-18
     */		
    ///////////////////////////////////////////////////////////////////////////////////////////////////////////
	@SuppressWarnings("unchecked")
	public BaseDAOImpl()
	{	
		presistClass = (Class<E>) ((ParameterizedType)this.getClass().getGenericSuperclass()).getActualTypeArguments()[0];
	}
	
	
	
   ///////////////////////////////////////////////////////////////////////////////////////////////////////////
	/**
     *  描    述： 保存一个实体对象
     *  输入参数： 
     *  返 回 值： 实体对象的PID
     *  作    者： 冯晶晶
     *  开发日期： 2009-08-18
     */	
    ///////////////////////////////////////////////////////////////////////////////////////////////////////////
	public int saveObject(E entity, String callerInfor)
	{
		int pid=0;	
		
		try
		{
			pid=(Integer)this.getHibernateTemplate().save(entity);			
		}
		catch(Exception e)
		{
			log.error(callerInfor+"\n"+e.getMessage());	
			throw new RuntimeException("");
		}	
		
		return pid;	
	}
	
	
	///////////////////////////////////////////////////////////////////////////////////////////////////////////
	/**
     *  描    述： 删除一个实体对象
     *  输入参数： 
     *  返 回 值： 返回删除的对象
     *  作    者： 冯晶晶
     *  开发日期： 2009-08-18
     */	
    ///////////////////////////////////////////////////////////////////////////////////////////////////////////	
	public boolean deleteObject(E entity,String callerInfor)
	{
		try
		{
			this.getHibernateTemplate().delete(entity);
			return true;
		}
		catch(Exception e)
		{
			log.error(callerInfor+"\n"+e.getMessage());	
			throw new RuntimeException("");
			
		}	
	
	}
	
	
	
	///////////////////////////////////////////////////////////////////////////////////////////////////////////
	/**
     *  描    述： 根据PID删除一组对象
     *  输入参数： 
     *  返 回 值： boolean
     *  作    者： 冯晶晶
     *  开发日期： 2009-08-18
     */	
    ///////////////////////////////////////////////////////////////////////////////////////////////////////////	
	public boolean deleteObject(final Object[] idCollection, final String callerInfor) {  
		
		boolean success = false;
		
		success = (Boolean) this.getHibernateTemplate().execute(new HibernateCallback(){

			public Object doInHibernate(Session session)
					throws HibernateException, SQLException {
				
				boolean isSuccess = true;

				String alias = presistClass.getSimpleName().toLowerCase().charAt(0) + "";
				String hql = "delete from ";
				hql += presistClass.getName() + " " + alias + " where " + alias;
				hql += ".pid in (:ids)";
						
				
				try
				{
					session.createQuery(hql)
		   			   .setParameterList("ids", idCollection)
		   			   .executeUpdate();
				}
				catch(Exception e)
				{
					isSuccess=false;
					log.error(callerInfor+"\n"+e.getMessage());		
					throw new RuntimeException("");
				}					
				
				return isSuccess;
			}
			
		});
		
		return success;
	}


	///////////////////////////////////////////////////////////////////////////////////////////////////////////
	/**
     *  描    述： 
     *  输入参数： 
     *  返 回 值： List<E>
     *  作    者： 冯晶晶
     *  开发日期： 2009-08-18
     */	
    ///////////////////////////////////////////////////////////////////////////////////////////////////////////
	public List<E> select(final String callerInfor)
	{
		return select(null, null, null,callerInfor);
	}

	public List<E> select(String condition,Map map, final String callerInfor)
	{
		return select(null, condition,map,callerInfor);
	}

	public List<E> select(String hql, String condition,Map map, final String callerInfor)
	{
		return select(-1, -1, null, false, hql, condition,map,callerInfor);
	}

	public List<E> select(int pageIndex, int pageSize, final String sortPorperty, boolean asc, final String callerInfor)
	{
		return select(pageIndex, pageSize, sortPorperty, asc, null, null,callerInfor);
	}

	public List<E> select(int pageIndex, int pageSize, final String sortPorperty,
						  boolean asc, String condition,Map map, final String callerInfor) {
		return select(pageIndex, pageSize, sortPorperty, asc, null, condition,map,callerInfor);
	}

	@SuppressWarnings("unchecked")
	public List<E> select(final int pageIndex, final int pageSize, final String sortPorperty,
						  final boolean asc, final String hql, final String condition,final Map map, final String callerInfor
						  ) {
		
		List list = this.getHibernateTemplate().executeFind(new HibernateCallback(){

			public Object doInHibernate(Session session)
					throws HibernateException, SQLException {
				
				String realHql = null;
				String alias = null;
				if(hql != null && hql.trim().length() > 0){
					realHql = hql;
				}
				if(realHql == null || realHql.length() == 0){
					realHql = "from ";
					realHql += presistClass.getName();
					alias = presistClass.getSimpleName().toLowerCase().charAt(0) + "";
					realHql += " " + alias;
				}
				
				if(condition != null && !realHql.contains("where") && condition.trim().length() > 0){
					realHql += " where " + condition;
				}
				
				if(sortPorperty != null) {
					realHql += " order by " + alias + "." + sortPorperty;
					if(asc)
						realHql += " asc ";
					else
						realHql += " desc ";
				}
				
				Query query = session.createQuery(realHql);
				

			if(map != null && map.size() > 0)
			{
				for(Object s:map.keySet())
				{
					query.setParameter((String)s, map.get((String)s));
				}
			}			
				
				
				if(pageIndex > 0 && pageSize > 0) {
					query.setFirstResult((pageIndex - 1) * pageSize)
						 .setMaxResults(pageSize);
				}
				
				Object o=null;
				
				try
				{
					o = query.list();
				}
				catch(Exception e)
				{
					log.error(callerInfor+"\n"+e.getMessage());
				}
				
				return o;
			}
			
		});
		return list;
	}
	
	
	public List<E> select(final String hql, final Map parameters, final int currentPage, final int pageSize,  final String callerInfor)
	{
		List list = this.getHibernateTemplate().executeFind(new HibernateCallback(){

			public Object doInHibernate(Session session)
					throws HibernateException, SQLException {
				
							
				Query query = session.createQuery(hql);
				

			if(parameters != null && parameters.size() > 0)
			{
				for(Object s:parameters.keySet())
				{
					query.setParameter((String)s, parameters.get((String)s));
				}
			}			
				
				
				if(currentPage > 0 && pageSize > 0) {
					query.setFirstResult((currentPage - 1) * pageSize)
						 .setMaxResults(pageSize);
				}
				
				Object o=null;
				
				try
				{
					o = query.list();
				}
				catch(Exception e)
				{
					log.error(callerInfor+"\n"+e.getMessage());
				}
				
				return o;
			}
			
		});
		return list;
		
	}
	
	
	public List<E> select(String hql, int currentPage, int pageSize,  final String callerInfor)
	{
		return this.select(hql,null,currentPage,pageSize,callerInfor);		
	}	
	
	
	
	///////////////////////////////////////////////////////////////////////////////////////////////////////////
	/**
     *  描    述： 根据PID获取对象
     *  输入参数： 
     *  返 回 值： Object
     *  作    者： 冯晶晶
     *  开发日期： 2009-08-18
     */	
    ///////////////////////////////////////////////////////////////////////////////////////////////////////////	
	@SuppressWarnings("unchecked")
	public E selectById(Object id, final String callerInfor)
	{		
		E entity = null;
		try
		{			
			entity = (E) this.getHibernateTemplate().load(presistClass, Integer.parseInt(id.toString()));
		}
		catch(Exception e)
		{			
			log.error(callerInfor+"\n"+e.getMessage());
		}
		return entity;
	}
	
		
	
	
	///////////////////////////////////////////////////////////////////////////////////////////////////////////
	/**
     *  描    述： 更新对象: 第一个版本返回的是E ,现在返回的是boolean  测试现在版本修改后的E 是否是修改后的值
     *  输入参数： 
     *  返 回 值： Object
     *  作    者： 冯晶晶
     *  开发日期： 2009-08-18
     */	
    ///////////////////////////////////////////////////////////////////////////////////////////////////////////	
	@SuppressWarnings("unchecked")
	public boolean updateObject(final E entity, final String callerInfor) {
		Object retObject = null;
			
		boolean result=false;
		
		retObject = this.getHibernateTemplate().execute(new HibernateCallback(){

			public Object doInHibernate(Session session)
					throws HibernateException, SQLException {
				
				Object temp=null;	
				
				try
				{
					temp= session.merge(entity); // do insert if pid doesn't exist. do update if pid exists.	
					
				}
				catch(Exception e)
				{
					log.error(callerInfor+"\n"+e.getMessage());			
					temp=null;  // 如果temp为null 则表明更新不成功
//					e.printStackTrace();
					throw new RuntimeException("");
				}
				
				return temp;	
			}			
		});
		
		if(retObject!=null)
		{
			result=true;			
		}
		else
		{
			result=false;			
		}
		
		return result;
	}
	
	
	
	///////////////////////////////////////////////////////////////////////////////////////////////////////////
	/**
     *  描    述： 根据条件查询单个对象
     *  输入参数： 
     *  返 回 值： Object
     *  作    者： 冯晶晶
     *  开发日期： 2009-08-18
     */	
    ///////////////////////////////////////////////////////////////////////////////////////////////////////////	
	public Object selectSingle(final String hql, final Map map, final String callerInfor){
		
		Object returnObject = null;
		
		returnObject = this.getHibernateTemplate().execute(new HibernateCallback(){

			public Object doInHibernate(Session session)
					throws HibernateException, SQLException {
				
				Query query = session.createQuery(hql);			
			
				if(map != null && map.size() > 0)
				{
					for(Object s:map.keySet())
					{
						query.setParameter((String)s, map.get((String)s));
					}
				}	
				
				
				Object o=null;
				
				try
				{
					o=query.uniqueResult();
				}
				catch(Exception e)
				{
					log.error(callerInfor+"\n"+e.getMessage());
				}
				
				return o;					   
				
			}
			
		});
		
		return returnObject;
	}
	
	
	///////////////////////////////////////////////////////////////////////////////////////////////////////////
	/**
     *  描    述： 获得某对象的数量
     *  输入参数： 
     *  返 回 值： Long
     *  作    者： 冯晶晶
     *  开发日期： 2009-08-18
     */	
    ///////////////////////////////////////////////////////////////////////////////////////////////////////////
	public Long countObject(final String callerInfor) {
		
		return this.countObject(null,callerInfor);
	}
	
	
	
	///////////////////////////////////////////////////////////////////////////////////////////////////////////
	/**
     *  描    述： 根据相关属性获得某对象的数量
     *  输入参数： 
     *  返 回 值： Long
     *  作    者： 冯晶晶
     *  开发日期： 2009-08-18
     */	
    ///////////////////////////////////////////////////////////////////////////////////////////////////////////
	public Long countObject(String property,final String callerInfor) {
		
		String hql = "select count(";
		if(property != null && property.trim().length() != 0) {
			hql += property + ") from ";
		} else {
			hql += "*) from ";
		}
		hql += presistClass.getName();
		
		Long result=null;
		
		try
		{
			result=Long.parseLong(this.selectSingle(hql, null,callerInfor).toString());
		}
		catch(Exception e)
		{
			log.error(callerInfor+"\n"+e.getMessage());
		}
		
		return result;
	}
		
    ////////////////////////////////////////////////////////////////////////////////////////////////

    /**
     *  描    述： 执行不带有数HQL语句
     *  输入参数： 
     *  返 回 值： List<E>
     *  作    者： 冯晶晶
     *  开发日期： 2009-08-13
     */	
	public List<E> ExecuteQuery(final String hql, final String callerInfor)
	{
		return this.ExecuteQuery(hql,null, callerInfor);
		
//		List<E> list=new ArrayList<E>(0);
//		
//		try
//		{
//			list=this.getHibernateTemplate().find(hql);			
//		}
//		catch(Exception e)
//		{
//			log.error(callerInfor+"\n"+e.getMessage());
//		}
//		
//		return list;
		
		
		
	}
	
////////////////////////////////////////////////////////////////////////////////////////////////

    /**
     *  描    述： 执行带有数HQL语句
     *  输入参数： 
     *  返 回 值： List<E>
     *  作    者： 冯晶晶
     *  开发日期： 2009-08-13
     */	
	@SuppressWarnings("unchecked")
	public List<E> ExecuteQuery(final String hql, final Map parameters, final String callerInfor)
	{
		List list = this.getHibernateTemplate().executeFind(new HibernateCallback(){

			public Object doInHibernate(Session session)
					throws HibernateException, SQLException {
				
							
				Query query = session.createQuery(hql);
				

			if(parameters != null && parameters.size() > 0)
			{
				for(Object s:parameters.keySet())
				{
					query.setParameter((String)s, parameters.get((String)s));
				}
			}			
				
				
				Object o=null;
				
				try
				{
					o = query.list();
				}
				catch(Exception e)
				{
					log.error(callerInfor+"\n"+e.getMessage());
				}
				
				return o;
			}
			
		});
		return list;
		
	}
	
	
	////////////////////////////////////////////////////////////////////////////////////////////////

    /**
     *   描    述： 执行不带有数HQL语句：适应于update , delete  三类HQL语句
     *  输入参数： 
     *  返 回 值： boolean
     *  作    者： 冯晶晶
     *  开发日期： 2009-08-07
     */	
	public boolean ExecuteNonQuery(final String hql,final String callerInfor)
	{
		return this.ExecuteNonQuery(hql, null, callerInfor);		
	}	
	/**
     *   描    述： 执行带有数HQL语句：适应于update , delete 三类HQL语句
     *  输入参数： 
     *  返 回 值： boolean
     *  作    者： 冯晶晶
     *  开发日期： 2009-08-07
     */		
	////////////////////////////////////////////////////////////////////////////////////////////////	
	 public boolean ExecuteNonQuery(final String hql,final Map map, final String callerInfor ){   
		 
		 boolean success = false;
		 success=(Boolean)this.getHibernateTemplate().execute(new HibernateCallback(){   
	  
	            public Object doInHibernate(Session session)   
	                    throws HibernateException, SQLException {   
	            	
	            	boolean isSuccess = true;
	            	
	                Query query = session.createQuery(hql);  
	                
	                
	                
	                if(map != null && map.size() > 0)
					{
						for(Object s: map.keySet())
						{
							query.setParameter((String)s, map.get((String)s));
						}
					}
	                
	                try
	                {
	                	query.executeUpdate();	                	
	                }
	                catch(Exception e)
	                {
	                	isSuccess=false;	
	                	log.error(callerInfor+"\n"+e.getMessage());
	                	throw new RuntimeException("");
	                }	                
	                return isSuccess;                
 
 
	            }   
	        }); 
		 
		 return success;
	    }   


	 
	 
	 
	 
	 
	 
	 
	 
	 
	 
	 
	 
	 
	 
	 @SuppressWarnings("unchecked")
		public List<E> ExecuteNamedQuery(final String queryName, final Map parameters, final String callerInfor)
		{
			List list = this.getHibernateTemplate().executeFind(new HibernateCallback(){

				public Object doInHibernate(Session session)
						throws HibernateException, SQLException {
					
								
					Query query = session.getNamedQuery(queryName);
					

				if(parameters != null && parameters.size() > 0)
				{
					for(Object s:parameters.keySet())
					{
						query.setParameter((String)s, parameters.get((String)s));
					}
				}			
					
					
					Object o=null;
					
					try
					{
						o = query.list();
					}
					catch(Exception e)
					{
						log.error(callerInfor+"\n"+e.getMessage());
					}
					
					return o;
				}
				
			});
			return list;
			
		}
	 
	 
 public boolean ExecuteNonNamedQuery(final String queryName,final Map map, final String callerInfor ){   
		 
		 boolean success = false;
		 success=(Boolean)this.getHibernateTemplate().execute(new HibernateCallback(){   
	  
	            public Object doInHibernate(Session session)   
	                    throws HibernateException, SQLException {   
	            	
	            	boolean isSuccess = true;
	            	
	            	Query query = session.getNamedQuery(queryName); 
	                
	                
	                
	                if(map != null && map.size() > 0)
					{
						for(Object s: map.keySet())
						{
							query.setParameter((String)s, map.get((String)s));
						}
					}
	                
	                try
	                {
	                	query.executeUpdate();	                	
	                }
	                catch(Exception e)
	                {
	                	isSuccess=false;	
	                	log.error(callerInfor+"\n"+e.getMessage());
	                	throw new RuntimeException("");
	                }	                
	                return isSuccess;                
 
 
	            }   
	        }); 
		 
		 return success;
	    }   

	 
	 
	 
	 
	 /**
		 * 查询某张表的某几个字段（select a from table）
		 * @param hql 查询hql语句
		 * @param parameters 参数集合
		 * @param currentPage 当前页
		 * @param pageSize 每页记录数
		 * @param callerInfor 调用此方法的方法
		 * @author 冯晶晶
		 * @date 2009-10-26
		 * @return
		 */
		@SuppressWarnings("unchecked")
		public List<Object> selectObject(final String hql, final Map parameters,
				final int currentPage, final int pageSize, final String callerInfor) {
			List list = this.getHibernateTemplate().executeFind(
					new HibernateCallback() {

						public Object doInHibernate(Session session)
								throws HibernateException, SQLException {

							Query query = session.createQuery(hql);

							if (parameters != null && parameters.size() > 0) {
								for (Object s : parameters.keySet()) {
									query.setParameter((String) s, parameters
											.get((String) s));
								}
							}

							if (currentPage > 0 && pageSize > 0) {
								query.setFirstResult((currentPage - 1) * pageSize)
										.setMaxResults(pageSize);
							}

							Object o = null;

							try {
								o = query.list();
							} catch (Exception e) {
								e.printStackTrace();
								log.error(callerInfor + "\n" + e.getMessage());
							}

							return o;
						}

					});
			return list;

		}
		/**
		 * 查询某张表的某几个字段（select a from table）不同于selectObject（）方法，此方法返回string类型（用于oracle里的long字段在页面不能显示）
		 * @param hql 查询hql语句
		 * @param parameters 参数集合
		 * @param currentPage 当前页
		 * @param pageSize 每页记录数
		 * @param callerInfor 调用此方法的方法
		 * @author 冯晶晶
		 * @date 2009-10-26
		 * @return
		 */
		@SuppressWarnings("unchecked")
		public List<String> selectProperty(final String hql, final Map parameters,
				final int currentPage, final int pageSize, final String callerInfor) {
			List list = this.getHibernateTemplate().executeFind(
					new HibernateCallback() {

						public Object doInHibernate(Session session)
								throws HibernateException, SQLException {

							Query query = session.createQuery(hql);

							if (parameters != null && parameters.size() > 0) {
								for (Object s : parameters.keySet()) {
									query.setParameter((String) s, parameters
											.get((String) s));
								}
							}

							if (currentPage > 0 && pageSize > 0) {
								query.setFirstResult((currentPage - 1) * pageSize)
										.setMaxResults(pageSize);
							}

							Object o = null;

							try {
								o = query.list();
							} catch (Exception e) {
								e.printStackTrace();
								log.error(callerInfor + "\n" + e.getMessage());
							}

							return o;
						}

					});
			return list;

		}
		
		
		/**
		 * qbc通过DetachedCriteria或map查询总记录数
		 * （如果是通过map则只支持全部equal查询或like查询，非like即equal,如为like查询则不要把非string类型字段放入map中否则会引发ClassCastException异常）
		 * 如要进行复杂查询则要自己写DetachedCriteria传入
		 * @param detachedCriteria
		 * @param map
		 * @param queryModel
		 * @param countProperty
		 * @param callerInfor
		 * @author 冯晶晶
	     * @Date  2009-10-26
		 * @return
		 */
		
		@SuppressWarnings("unchecked")
		public Long countObject(final DetachedCriteria detachedCriteria,Map map,final String queryModel,String countProperty ,final String callerInfor) {
			Long count=null;
			try {
				Criteria criteria;
				///////////////////////////////////////////////
				//建立Criteria对象
				if (detachedCriteria != null) {
					criteria = detachedCriteria.getExecutableCriteria(getSession());
				}else{
					criteria=getSession().createCriteria(presistClass);
				}
				///////////////////////////////////////////////
				//设定计算总行数列
				if(countProperty != null && countProperty.trim().length() != 0){
				criteria.setProjection(Projections.count(countProperty));
				}
				else{
					criteria.setProjection(Projections.count("pid"));
				}
				///////////////////////////////////////////////
				//通过map创建查询语句
				if (map != null && map.size() > 0) {
					if(queryModel.toLowerCase().equals("like")){
					Iterator it = map.entrySet().iterator();
					while (it.hasNext()) {
						Map.Entry entry = (Map.Entry) it.next();
						Object key = entry.getKey();
						Object value = entry.getValue();			
						criteria.add(Restrictions.like(key.toString(), value.toString(),MatchMode.ANYWHERE));
						}
						
					}else{
						criteria.add(Restrictions.allEq(map));	
					}
				}
				
				/////////////////////////////////////////////
				count =  Long.parseLong(criteria.uniqueResult().toString());
			} catch (Exception e) {
				// e.printStackTrace();
				log.error(callerInfor + "\n" + e.getMessage());
			}

			return count;
			
		}
		 /**	
		 * 通过DetachedCriteria或map查询获得记录
		 * （如果是通过map则只支持全部equal查询或like查询，非like即equal，如为like查询则不要把非string类型字段放入map中否则会引发ClassCastException异常）
		 * 如要进行复杂查询则要自己写DetachedCriteria传入
		 * @param detachedCriteria
		 * @param map 查询的字段名称和值(如果为联表查询字段名称要为paper.pid(查询和Registration关联的paper表的pid属性))
		 * @param currentPage当前页数
		 * @param pageSize每页显示多少条记录
		 * @param callerInfor被哪一个方法调用
		 * @param queryModel 查询模式（like或者 =）
		 * @param orderProperty 排序的那个字段
	     * @param orderSequence	 asc或desc  
	     * @author 冯晶晶
	     * @Date  2009-10-26
		 * @return结果集合
		 */
		@SuppressWarnings("unchecked")
		public List<E> selectByCriteria(final DetachedCriteria detachedCriteria,
				Map map,final String queryModel,final int currentPage, final int pageSize,final String orderProperty,final String orderSequence,
				final String callerInfor) {

			List<E> list = null;
			try {
				Criteria criteria;
				///////////////////////////////////////////////
				//建立Criteria对象
				if (detachedCriteria != null) {
					criteria = detachedCriteria.getExecutableCriteria(getSession());
				}else{
					criteria=getSession().createCriteria(presistClass);
				}
				
				///////////////////////////////////////////////
				//通过map创建查询语句
				if (map != null && map.size() > 0) {
					if(queryModel.toLowerCase().equals("like")){
					Iterator it = map.entrySet().iterator();
					while (it.hasNext()) {
						Map.Entry entry = (Map.Entry) it.next();
						Object key = entry.getKey();
						Object value = entry.getValue();				
						criteria.add(Restrictions.like(key.toString(), value.toString(),MatchMode.ANYWHERE));
						}
						
					}else{
						criteria.add(Restrictions.allEq(map));	
					}
				}
				/////////////////////////////////////////////
				//排序
				if(orderProperty!=null&&!orderProperty.equals("")){
					if(orderSequence.toLowerCase().equals("asc")){
					criteria.addOrder(Order.asc(orderProperty));
					}
					else{
						criteria.addOrder(Order.desc(orderProperty));
					}
				}
				///////////////////////////////////////////////
				//分页查询
				if (currentPage > 0 && pageSize > 0) {
					criteria.setFirstResult((currentPage - 1) * pageSize)
							.setMaxResults(pageSize);
				}
				///////////////////////////////////////////////
				
				list = criteria.list();
			} catch (Exception e) {
				 e.printStackTrace();
				log.error(callerInfor + "\n" + e.getMessage());
			}
			return list;
		}
	 
	 
	 
	 
	 
	 
	 
	 
	 
	 
	 
	 
	 
	 
	 
	 
	 
	 
	 
	 
	 
	 
	 

}
